package com.xncoding.pos.controller.webfluxTest;

import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.HttpHandler;
import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.netty.http.server.HttpServer;

/**
 * 使用Springboot构建一个webflux应用，默认就是使用Netty，因为Netty本身就是非阻塞式的实现。
 * SpringWebflux 基于 Reactor，默认使用容器是 Netty，Netty 是高性能的 NIO 框架，异步非阻塞的框架。
 *
 * @Author guoyb
 * @Date 2024/1/30  11:05
 */
@Configuration
@RequiredArgsConstructor
public class PersonRouter {

    private final PersonHandler personHandler;

    /**
     * 然后定义“PersonController”，响应式风格中不再使用@RequestMapping声明地址映射了，
     * 而是通过RouterFunctions.route().GET()方法
     *
     * @return
     */
    @Bean
    public RouterFunction<ServerResponse> personRoutes() {
        // 创建路由
        RouterFunction<ServerResponse> routerFunction = RouterFunctions.route()
                .GET("/person/{id}", RequestPredicates.accept(MediaType.APPLICATION_JSON), personHandler::getPerson)
                .GET("/person", RequestPredicates.accept(MediaType.APPLICATION_JSON), personHandler::listPeople)
                .POST("/person", personHandler::createPerson)
                .build();
        return routerFunction;
    }


    //2 创建服务器完成适配
    public void createReactorServer() {
        //路由和handler适配
        RouterFunction<ServerResponse> route = personRoutes();
        HttpHandler httpHandler = RouterFunctions.toHttpHandler(route);
        ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler);
        //创建服务器
        HttpServer httpServer = HttpServer.create();
        httpServer.handle(adapter).bindNow();
    }

    // public static void main(String[] args) {
    //     //调用服务器地址
    //     WebClient webClient = WebClient.create("http://127.0.0.1:61824");
    //
    //     //根据id查询
    //     String id = "1";
    //     // 发送请求方式，要调用的方法，接收参数类型，返回类型
    //     User userresult = webClient.get().uri("/users/{id}", id)
    //             .accept(MediaType.APPLICATION_JSON).retrieve().bodyToMono(User.class)
    //             .block();
    //     System.out.println(userresult.getName());
    //
    //     //查询所有
    //     Flux<User> results = webClient.get().uri("/users")
    //             .accept(MediaType.APPLICATION_JSON).retrieve().bodyToFlux(User.class);
    //     results.map(stu -> stu.getName())
    //             .buffer().doOnNext(System.out::println).blockFirst();
    // }
}
